package com.xu.demo.factoryPattern;

import java.lang.reflect.InvocationTargetException;

/***
 *
 * 超级工厂(简单工厂 + 反射 + 泛型)，利用反射机制解决开闭原则的问题
 */
public class SuperFactory {

    public static void main(String[] args) {
        //com.lx.dom.impl.pro这一段是包名，IPhone是类名,不能输错
        Phone phone = SuperFactory.create("com.xu.demo.factoryPattern.MiPhone") ;
        phone.call();
    }


    /**
     * 根据完整类型名动态加载class并创建实例
     * @param className
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T create(String className) {

        try {
            //动态加载class
            Class<?> clazz = Class.forName(className);

            //通过calss对象获取构造函数创建新实例
            return (T) clazz.getConstructor().newInstance();
        } catch (Exception e) {

            //异地重抛
            throw new RuntimeException("Create instance fail.",e);
        }
    }

}
